package com.ipzoe.common.retrofit.request;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 * LeanCloud推送消息实体
 * <p>
 * 字段含义请参考: https://leancloud.cn/docs/push_guide.html#推送消息
 * <p>
 * Created 2018/01/19.
 *
 * @author pfzhang
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LeanCloudPushMessage {

    /** 自定义类型 系统消息 = 0 */
    public static final String TYPE_SYSTEM = "0";

    /** 检索 _Installation 表使用的查询条件，JSON 对象 */
    private Where where;

    /** 推送的内容数据，JSON 对象 */
    private Data data;

    /** 推送给哪些频道 */
    private String[] channels;

    /** 仅对 iOS 有效。设置使用开发证书（dev）还是生产证书（prod）*/
    //private String prod = "prod";
    private String prod = "dev";

    /**
     * 构造发送给指定installation id用户的实体
     *
     * @param objectIds 要推送的用户列表
     * @param alert     提示消息内容
     */
    public LeanCloudPushMessage(List<String> objectIds, String alert) {
        this.where = new Where(objectIds);

        this.data = new Data();
        this.data.ios.setAlert(alert);
        this.data.android.setAlert(alert);
    }

    /**
     * 构造发送给指定   频道  的实体
     *
     * @param channels      要推送的频道列表
     * @param alert         提示消息内容
     * @param customType    自定义类型
     */
    public LeanCloudPushMessage(String[] channels, String alert, String customType) {
        this.channels = channels;

        this.data = new Data();
        this.data.ios = new ios();
        this.data.ios.setAlert(alert);
        this.data.ios.setCustomType(customType);

        this.data.android = new android();
        this.data.android.setAlert(alert);
        this.data.android.setCustomType(customType);
    }

    /**
     * 自定义推送
     *
     * @param channels         要推送的频道列表
     * @param alert            提示消息内容
     * @param customKey        自定义内容
     * @param customType       自定义类型
     * @param silent           是否透传
     */
    public LeanCloudPushMessage(String[] channels, String alert, String customKey, String customType, Boolean silent) {
        this.channels = channels;

        this.data = new Data();
        this.data.ios = new ios();
        this.data.android = new android();

        this.data.ios.setAlert(alert);
        this.data.ios.setCustomKey(customKey);
        this.data.ios.setCustomType(customType);

        this.data.android.setAlert(alert);
        this.data.android.setCustomKey(customKey);
        this.data.android.setCustomType(customType);
        if (null != silent) {
            this.data.android.setSilent(silent);
        }
    }

    @lombok.Data
    private class Where {

        private In objectId;

        public Where(List<String> list) {
            objectId = new In();
            objectId.setIn(list);
        }

        @lombok.Data
        private class In {

            @JsonProperty("$in")
            private List<String> in;
        }
    }

    @lombok.Data
    private class Data {

        private ios ios;

        private android android;
    }

    @lombok.Data
    private class ios {

        /** 消息内容 */
        private String alert;

        /** 数字类型，未读消息数目，应用图标边上的小红点数字，可以是数字，也可以是字符串 "Increment"（大小写敏感） */
        private String badge = "Increment";

        /** 自定义内容 */
        private String customKey;

        /** 自定义类型 */
        private String customType;
    }

    @lombok.Data
    private class android {

        /** 消息内容 */
        private String alert;

        /** 显示在通知栏的标题 */
        private String title;

        /** com.iozoe.common.app.push */
        private String action = "com.iozoe.common.app.push";

        /** 自定义内容 */
        private String customKey;

        /** 自定义类型 */
        private String customType;

        /** 用于控制是否关闭推送通知栏提醒，默认为 false，即不关闭通知栏提醒 */
        private boolean silent = false;
    }
}
